package mc

import (
	"fmt"
	"github.com/sirupsen/logrus"
)

// 结果体，也当做为错误panic
type Result struct {
	HttpStatus   int                    // 响应代码
	Code         string                 // 消息代码
	Message      string                 // 消息
	Data         interface{}            // 数据体
	Extra        map[string]interface{} // 附加的数据
	RenderType   RenderType             // 渲染方式
	OnlyOutData  bool                   // 仅输出Data数据
	IsInfo       bool                   // 是否是普通提示性消息（使用错误输出时有效）
	LogLevel     logrus.Level           // 错误级别
	RedirectUrl  string                 // 跳转url, 当HttpStatus=302,服务端直接跳转，否则此值会传出页面分配器的Result["redirect_url"]中
	RedirectTime int                    // 跳转时间(秒，0-立即自动跳转，n-N秒自动后跳，-1不自动转跳)，服务端跳转无效，会传出页面分配器的Result["redirect_time"]中
}


// 内容分配
type Assign struct {
	Context   *Context               // 上下文
	Model     *Model                 // 当前模型
	ModelPage *ModelPage             // 模型页
	Result    map[string]interface{} // 最终输出的结果集
}



// 给分配器添加内容
func (assign *Assign) Append(key string, value interface{}) (r *Assign) {
	if assign.Result == nil{
		assign.Result = make(map[string]interface{})
	}
	assign.Result[key] = value
	return assign
}

// 实现结果错误接口
func (result *Result) Error() string {
	return result.Message
}

// 给结果集上添加内容
func (result *Result) Append(key string, value interface{}) (r *Result) {
	if result.Extra == nil{
		result.Extra = make(map[string]interface{})
	}
	result.Extra[key] = value
	return result
}

// 附加消息
func (result *Result) AddMessage(s string) *Result {
	if s != "" {
		result.Message += fmt.Sprintf("(%s)", s)
	}
	return result
}

// 设置信息类型
func (result *Result) Info() *Result {
	result.IsInfo = true
	result.LogLevel = logrus.InfoLevel
	return result
}

// 新建一个result类型的错误复本，同时指定错误消息（为""时，使用该状态的默认消息）
func (result *Result) Copy(s string, a ...interface{} ) *Result {
	msg := s
	if a != nil {
		msg = fmt.Sprintf(s, a...)
	}
	rst := &Result{
		HttpStatus:  result.HttpStatus,
		Code:        result.Code,
		Message:     result.Message,
		Data:        result.Data,
		Extra:       result.Extra,
		RenderType:  result.RenderType,
		LogLevel:    result.LogLevel,
	}
	_ = rst.AddMessage(msg)
	return rst
}
